package com.gantang.gax.engine.nativelib.service;

import com.gantang.gax.engine.model.EngineResult;
import com.gantang.gax.engine.model.VariableGroup;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.util.List;

/**
 * cxd引擎服务
 *
 * @author gantang
 */
@Service("cxdEngineNativeService")
public class CxdEngineNativeService {
    /**
     * 重新加载引擎
     *
     * @param engineId 引擎ID
     * @return 引擎是否重新加载成功
     */

    public native EngineResult<Boolean> reload(String engineId);

    /**
     * 卸载引擎，释放内存
     *
     * @param engineId 引擎ID
     * @return 引擎是否卸载成功
     */

    public native EngineResult<Boolean> unLoad(String engineId);

    /**
     * 销毁引擎，释放内存
     * 有编译文件的同时删除编译文件
     *
     * @param engineId 引擎ID
     * @return 引擎是否销毁成功
     */
    public native EngineResult<Boolean> destory(String engineId);

    /**
     * 根据输入的外部变量值编码列表，依次列出每个家族下可选的特征值清单
     *
     * @param engineId   引擎ID
     * @param variables  输入的外部变量值编码列表   可为空
     * @param groupCodes 限定的 groupCode 列表，用于限制查询范围  可为空
     * @return 符合当前约束规则条件下可选的变量值编码列表
     */
    public native EngineResult<List<VariableGroup>> findAllSelectableVariables(String engineId, List<String> variables, List<String> groupCodes);

    /**
     * 最快找到一个满足约束规则的变量值排列组合
     *
     * @param engineId            引擎ID
     * @param variables           输入的外部变量值编码列表  可以为空
     * @param recommendOnConflict 当存在矛盾是否推荐       可以为空
     * @return 返回所有满足约束规则的变量值排列组合
     */
    public native EngineResult<List<String>> findOneSolution(String engineId, List<String> variables, Boolean recommendOnConflict);

    /**
     * 根据权重，找到最适合一个满足约束规则的变量值排列组合
     *
     * @param engineId            引擎ID
     * @param variables           输入的外部变量值编码列表  可以为空
     * @param recommendOnConflict 当存在矛盾是否推荐       可以为空
     * @return 返回所有满足约束规则的变量值排列组合
     */
    public native EngineResult<List<String>> findBestSolution(String engineId, List<String> variables, Boolean recommendOnConflict);

    /**
     * 找到所有满足约束规则的变量值排列组合，限制返回数量
     *
     * @param engineId   引擎ID
     * @param limitCount 限制最大的数量，超过则不返回
     * @return 所有满足约束规则的变量值排列组合
     */
    public native EngineResult<List<List<String>>> findAllSolutions(String engineId, int limitCount);

    /**
     * 获取符合条件的解总数量
     *
     * @param engineId  引擎ID
     * @param variables 输入的外部变量值编码列表  可为空
     * @return 返回符合条件的解总数量
     */
    public native EngineResult<BigInteger> solutionCount(String engineId, List<String> variables);
}